#ifndef READXML_H
#define READXML_H

#include <iostream>
#include <map>
#include <vector>

#include "tinyxml.h"
#include "tinystr.h"


class Readxml
{
public:
    Readxml();

    virtual ~Readxml()
    {
    }

    //读取xml文件,通过
    static TiXmlDocument *readDoc(const char *pXmlPath);

    //查询一个指定xml节点，通过
    //对应参数：1.节点名称 2.属性名称 3.属性值 4.读取后的xml
    static TiXmlNode *selectSingleNode(std::string strNodeName, std::string strNodeAttrName, std::string strNodeAttrValue, TiXmlDocument *pDoc);
    static TiXmlNode *selectSingleNode(std::string strNodeName, TiXmlDocument *pDoc);

    //通过节点名称返回节点vector
    static std::vector<TiXmlNode*> getNodeVec(TiXmlDocument *pDoc, const char *pNodeName); //对应参数：1.读取后xml 2.节点名称
    static std::vector<TiXmlNode*> getNodeVec(TiXmlDocument *pDoc, const char *pNodeName, TiXmlNode *pParentNode); //1.读取后xml 2.父节点的名字

    //在特定节点下查找所需节点
    static std::vector<TiXmlNode*> getSelectNodeVec(TiXmlDocument *pDoc, const char *pNodeName, TiXmlNode *pSelectNode);

    //增加一个节点,对应参数：1.父节点名称（通过SelectSingleNode或getNodeVec查找） 2.节点名称 3.读取后xml 4.属性map<属性名称,属性值>
    static bool addSingleNode(TiXmlNode *pNode, const char *pNodeName, TiXmlDocument *pDoc, std::map<const char*, const char*> mapAttr);

    //添加一个无属性节点,对应参数：1.父节点名称（通过SelectSingleNode或getNodeVec查找） 2.节点名称 3.读取后xml
    static bool addNoAttrNode(TiXmlNode *pNode, const char *pNodeName, TiXmlDocument *pDoc);
    static TiXmlNode *addNoAttrNodeAndReturn(TiXmlNode *pNode, const char* pNodeName,TiXmlDocument *pDoc);

    //遍历子节点，并放入vector中,对应参数: 1.遍历节点 2.节点名称 3.节点vector
    static void insertNodeVec(TiXmlNode * pNode, const char *pNodeName, std::vector<TiXmlNode*> &vecNode);

    //删除一个节点,对应参数：1.删除节点 （通过SelectSingleNode查找）2.读取后xml
    static bool delSingleNode(TiXmlNode *pNode, TiXmlDocument *pDoc);

private:
    //根据父节点循环遍历查找子节点,辅助SelectSingleNode使用，不需要单独调用
    static TiXmlNode *selectChildNode(TiXmlNode *pNode, std::string strNodeName);
    static TiXmlNode *selectChildNode(TiXmlNode *pNode, std::string strNodeName, std::string strNodeAttrName, std::string strNodeAttrValue);
};

#endif // READXML_H
